class Animal{
    String name;
    int leg;
    String furcolor;
    public Animal(String name, int leg) {
        this.name = name;
        this.leg = leg;
        System.out.println("Animal：构造方法执行");
    }
    {
      System.out.println("Animal：实例代码块执行");
    }
    static{
        System.out.println("Animal：静态代码块执行");
    }
    public Animal() {
        System.out.println("无参构造方法Animal()");
    }
    public void eat(){
        System.out.println(name+"正在吃东西");
    }
    public void run(){
        System.out.println(name+"正在用"+leg+"条腿在跑");
    }
    public void color(){
        System.out.println(name + "是" + furcolor + "的");
    }
}
class Shark extends Animal{
    public Shark(String name, int leg) {
        super(name, leg);
    }

    @Override
    public void eat() {
        System.out.println(name+"正在吃大鱼");
    }
}
class Fish extends Animal{
    public Fish(String name, int leg) {
        super(name, leg);
    }

    @Override
    public void eat() {
        System.out.println(name+"正在吃虾米");
    }
}
public class practice {
    // 编译器在编译代码时，并不知道要调用Shark还是Fish 中eat的方法
    // 等程序运行起来后，形参a引用的具体对象确定后，才知道调用那个方法
    // 注意：此处的形参类型必须时父类类型才可以
    public static void fun(Animal animal){
        animal.eat();
    }
    public static void main(String[] args) {
        Fish fish = new Fish("鲤鱼",0);
        Shark shark = new Shark("脆脆鲨",0);
        //向上转型
        Animal animal = new Fish("好多鱼",0);
        //向下转型
        fish = (Fish)animal;
        fun(fish);
        fun(shark);
        /**Mouse mouse1 = new Mouse("米奇",4);
        System.out.println("=========");
        Mouse mouse2 = new Mouse("杰瑞",4);
       /**Animal animal1 = new Animal("大黄",4);
        System.out.println("=========");
       Animal animal2 = new Animal("二狗",4);*/
    }

}
class Mouse extends Animal   {
    public Mouse(String name, int leg) {
        super(name, leg);
        System.out.println("Mouse：构造方法执行");
    }
    {
        System.out.println("Mouse：实例代码块执行");
    }
    static{
        System.out.println("Mouse：静态代码块执行");
    }
}

class Dog extends Animal{
    String name;
    int leg;

    public Dog() {
        System.out.println("Dog()");
    }

    public void dogvoice(){
        System.out.println(name+"正在喵喵叫");
    }
    //与父类中run()构成重载
    public void run(int leg){
        System.out.println(name+"正在用"+leg+"条腿在跑");
    }
    //与父类中eat()构成重写
    public void eat(){
        System.out.println(name+"正在用子类中的eat()吃东西");
    }
    public void method(){
        // 对于同名的成员变量，直接访问时，访问的都是子类的
        String name = "大黄";  //等价于： this.name = 100;this是对当前对象的引用
        leg = 4;  //等价于： this.leg = 100;this是对当前对象的引用

        //访问父类的成员变量时，需要借助super关键字,super是获取到子类对象中从基类继承下来的部分
        super.name = "狗蛋";
        super.leg = 4;
        // 父类和子类中构成重载的方法，直接可以通过参数列表区分清访问父类还是子类方法
        run();//无传参，访问的是父类中的方法
        run(20);// 有传参，访问子类中的run()
        // 如果在子类中要访问重写的基类方法，则需要借助super关键字
        super.eat();//访问父类的方法
        eat();//方法重写，直接访问，则永远访问到的都是子类中的eat()，父类的无法访问到
    }
}

class cat extends Animal{
    public void catvoice(){
        System.out.println(name+"正在喵喵叫");
    }
}

/**class Dog{
    String name;
    int leg;
    String furcolor;
    public void eat(){
        System.out.println(name+"正在吃骨头");
    }
    public void run(){
        System.out.println(name+"正在用"+leg+"条腿在跑");
    }
    public void color(){
        System.out.println(name + "是" + furcolor + "的");
    }
    public void voice(){
        System.out.println(name+"正在汪汪叫");
    }
}
class Cat{
    String name;
    int leg;
    String furcolor;
    public void eat(){
        System.out.println(name+"正在吃鱼");
    }
    public void run(){
        System.out.println(name+"正在用"+leg+"条腿在跑");
    }
    public void color(){
        System.out.println(name + "是" + furcolor + "的");
    }
    public void voice(){
        System.out.println(name+"正在喵喵叫");
    }
}*/

